package com.poc.importacao.baseabstract;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.poc.importacao.bacias.BaciaContemBaciaManager;
import com.poc.importacao.bacias.BaciaContemRioManager;
import com.poc.importacao.rios.EstadoContemRioManager;
import com.poc.log.Log;

public abstract class AbstractAreaContemRioManager extends AbstractManager {

	public static final String SELECT_ENTIDADE = "select codlugar from lugar where codtipolugar = %s";
	public static final String SELECT_RIOS_JOIN_AREA_LINHA = "select r.codlugar from lugar r, linha n, area a where r.codtipolugar = %s and r.codlugar = n.codlugar and st_intersects(n.geom, a.geom) and a.codlugar = %s";
	public static final String SELECT_RIOS_JOIN_AREA_MULTILINHA = "select r.codlugar from lugar r, multilinha n, area a where r.codtipolugar = %s and r.codlugar = n.codlugar and st_intersects(n.geom, a.geom) and a.codlugar = %s";
	public static final String SELECT_RIOS_JOIN_MULTIAREA_LINHA = "select r.codlugar from lugar r, linha n, multiarea a where r.codtipolugar = %s and r.codlugar = n.codlugar and st_intersects(n.geom, a.geom) and a.codlugar = %s";
	public static final String SELECT_RIOS_JOIN_MULTIAREA_MULTILINHA = "select r.codlugar from lugar r, multilinha n, multiarea a where r.codtipolugar = %s and r.codlugar = n.codlugar and st_intersects(n.geom, a.geom) and a.codlugar = %s";

	public AbstractAreaContemRioManager() {
		super();
	}

	protected ResultSet getRelacionados(String codLugarBaciaPrincipal) throws SQLException {
		String query = String.format(EstadoContemRioManager.SELECT_RIOS_JOIN_AREA_LINHA, BaciaContemRioManager.COD_TIPO_LUGAR_RIO, codLugarBaciaPrincipal);
		return BaciaContemBaciaManager.getDatabaseManager().execute(query);
	}

	protected ResultSet getRelacionadosMultiLinha(String codLugarBaciaPrincipal)
			throws SQLException {
				String query = String.format(EstadoContemRioManager.SELECT_RIOS_JOIN_AREA_MULTILINHA, BaciaContemRioManager.COD_TIPO_LUGAR_RIO, codLugarBaciaPrincipal);
				return BaciaContemBaciaManager.getDatabaseManager().execute(query);
			}

	protected ResultSet getRelacionadosMultiArea(String codLugarBaciaPrincipal) throws SQLException {
		String query = String.format(EstadoContemRioManager.SELECT_RIOS_JOIN_MULTIAREA_LINHA, BaciaContemRioManager.COD_TIPO_LUGAR_RIO, codLugarBaciaPrincipal);
		return BaciaContemBaciaManager.getDatabaseManager().execute(query);
	}

	protected ResultSet getRelacionadosMultiLinhaMultiArea(String codLugarBaciaPrincipal)
			throws SQLException {
				String query = String.format(EstadoContemRioManager.SELECT_RIOS_JOIN_MULTIAREA_MULTILINHA, BaciaContemRioManager.COD_TIPO_LUGAR_RIO, codLugarBaciaPrincipal);
				return BaciaContemBaciaManager.getDatabaseManager().execute(query);
			}

	@Override
	public void createInserts(String fileName) throws SQLException, IOException {
		ResultSet codLugarEntidades = this.getEntidadePrincipal();
		ResultSet riosRelacionados = null;
		
		String codLugarEntidade;
	
		Double count = 0.0;
		Log inserts = new Log(fileName);
		inserts.append("INSERT INTO RELACIONAMENTO_GEO (codlugar1, codlugar2, codtiporelgeo, datacriacao) VALUES \n");
		while(codLugarEntidades.next()){
			codLugarEntidade = codLugarEntidades.getString(1);
		
			riosRelacionados = this.getRelacionados(codLugarEntidade);
			while(riosRelacionados.next()) {
				inserts.append((String.format(AbstractManager.INSERT_RELACIONAMENTO_PARAMS, riosRelacionados.getString(1), codLugarEntidade, this.getTipoRelacionamento())));					
			}
			
			riosRelacionados = this.getRelacionadosMultiLinha(codLugarEntidade);
			while(riosRelacionados.next()) {
				inserts.append((String.format(AbstractManager.INSERT_RELACIONAMENTO_PARAMS, riosRelacionados.getString(1), codLugarEntidade, this.getTipoRelacionamento())));					
			}
			
			riosRelacionados = this.getRelacionadosMultiArea(codLugarEntidade);
			while(riosRelacionados.next()) {
				inserts.append((String.format(AbstractManager.INSERT_RELACIONAMENTO_PARAMS, riosRelacionados.getString(1), codLugarEntidade, this.getTipoRelacionamento())));					
			}
			
			riosRelacionados = this.getRelacionadosMultiLinhaMultiArea(codLugarEntidade);
			while(riosRelacionados.next()) {
				inserts.append((String.format(AbstractManager.INSERT_RELACIONAMENTO_PARAMS, riosRelacionados.getString(1), codLugarEntidade, this.getTipoRelacionamento())));					
			}
			
			//System.out.print((count/this.getEntidadeCount() * 100.) + "%\r");
			count++;
		}
		//System.out.print("Done!\r");
		inserts.close();
		this.finalize();
		
	}

	protected abstract Double getEntidadeCount();
	
	protected abstract Integer getTipoRelacionamento();

	protected ResultSet getEntidadePrincipal() throws SQLException {
		//System.out.println(String.format(AbstractAreaContemRioManager.SELECT_ENTIDADE, this.getEntidadeCode()));
		return EstadoContemRioManager.getDatabaseManager().execute(String.format(AbstractAreaContemRioManager.SELECT_ENTIDADE, this.getEntidadeCode()));
	}

	protected abstract Integer getEntidadeCode();

}